import { Page } from 'puppeteer';

// 模拟人类滚动的函数
export async function monitorHumanScroll(page: Page): Promise<void> {
  await page.evaluate(async () => {
    // 随机延迟函数，模拟人类操作的不规律性
    const randomDelay = (min: number, max: number) =>
      new Promise((resolve) =>
        setTimeout(resolve, Math.random() * (max - min) + min),
      );

    // 获取页面高度
    const getScrollHeight = () => document.body.scrollHeight;

    await new Promise<void>(async (resolve) => {
      let totalHeight = 0;
      let lastHeight = getScrollHeight();
      let stagnantCount = 0; // 页面高度无变化的次数，用于检测加载结束

      const scrollStep = async () => {
        const currentHeight = getScrollHeight();
        const windowHeight = window.innerHeight;

        // 随机滚动距离（50-200 像素），模仿人类的不规则滚动
        const distance = Math.floor(Math.random() * 150) + 50;
        window.scrollBy(0, distance);
        totalHeight += distance;

        // 检查是否接近底部
        if (totalHeight >= currentHeight - windowHeight) {
          // 页面高度变化，可能是动态加载
          if (currentHeight > lastHeight) {
            lastHeight = currentHeight;
            stagnantCount = 0; // 重置计数器
            await randomDelay(500, 1500); // 等待加载，500-1500ms
            scrollStep(); // 继续滚动
          } else {
            stagnantCount++;
            // 高度连续几次无变化，认为滚动到底
            if (stagnantCount >= 3) {
              resolve();
            } else {
              await randomDelay(300, 1000); // 短暂停顿后继续
              scrollStep();
            }
          }
        } else {
          // 随机停顿，模拟人类浏览
          if (Math.random() < 0.3) {
            // 30% 概率停顿
            await randomDelay(800, 2000); // 停顿 0.8-2 秒
          } else {
            await randomDelay(50, 200); // 正常滚动间隔 50-200ms
          }

          // 随机回滚，模拟人类行为
          if (Math.random() < 0.1) {
            // 10% 概率回滚
            window.scrollBy(0, -Math.floor(Math.random() * 100 + 50));
            await randomDelay(500, 1200);
          }

          scrollStep(); // 继续滚动
        }
      };

      // 开始滚动
      scrollStep();
    });
  });
}
